package cn.zlp.user.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * 后端登录拦截器
 * @program: pethome
 * @author: Mr.Zhang
 * @create: 2021-12-09 19:27
 **/
@Component // 用第四个注解,将这个类交给spring进行管理
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 在核心控制器之前执行该方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从响应头中获取token,即之前的jseesionid
        String token = request.getHeader("token");
        if (token != null) { // 说明登录没有过期
            // 通过token在redis数据库中获取登录信息
            Object obj = redisTemplate.opsForValue().get(token);
            if (obj != null) { // 登录成功
                // 更新过期时间
                redisTemplate.opsForValue().set(token,obj,30, TimeUnit.MINUTES);
                return true;
            }
            // 提取到下面去了,代码复用
        }
        // 跳转登录页面
        response.setCharacterEncoding("UTF-8");
        // 设置返回类型为json字符串
        response.setContentType("application/json;UTF-8");
        // 写出数据
        response.getWriter().write("{\"success\": false,\"msg\": \"noLogin\"}");
        return false;
    }
}
